package cn.edu.kzjsxy.graduationproject.controller;

import cn.edu.kzjsxy.graduationproject.common.Page;
import cn.edu.kzjsxy.graduationproject.common.Result;
import cn.edu.kzjsxy.graduationproject.common.TokenUtil;
import cn.edu.kzjsxy.graduationproject.dto.ChangePassword;
import cn.edu.kzjsxy.graduationproject.dto.LoginRequest;
import cn.edu.kzjsxy.graduationproject.entity.Users;
import cn.edu.kzjsxy.graduationproject.service.IUsersService;
import cn.edu.kzjsxy.graduationproject.tool.AliOSSUtils;
import cn.edu.kzjsxy.graduationproject.tool.SHA256Encryptor;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;

/**
 * <p>
 * 用户表：用于存储系统用户信息 前端控制器
 * </p>
 *
 * @author chén
 * @since 2024-04-14
 */
@Api(tags = "用户")
@RestController
@RequestMapping("/users")
public class UsersController {

//	用户信息的service
	@Autowired
	private IUsersService usersService;

	@Autowired
	private TokenUtil tokenUtil;
//

// 注入阿里云上传图片工具类
	@Autowired
	private AliOSSUtils aliOSSUtils;

//	密码加密工具类
	private  final SHA256Encryptor SHA256Encryptor=new SHA256Encryptor();


//	修改密码
	@PostMapping("/updatePassword")
	@ApiOperation("修改密码")
	public Result updatePassword(@RequestBody ChangePassword changePassword, HttpServletRequest request) {
		Users user = usersService.getById(changePassword.getUserId());
		if (user == null) {
			return Result.error("用户不存在");
		}
		if(user.getPassword().equals(SHA256Encryptor.encrypt(changePassword.getOldPassword()))){
			// 对用户密码进行加密
			user.setPassword(SHA256Encryptor.encrypt(changePassword.getPassword()));
			return Result.judgment(usersService.updateById(user));
		}else{
			return  Result.error("旧密码错误！");
		}

	}


	@PostMapping("/updateAvatarByUserId")
	@ApiOperation("通过用户ID更新用户头像")
	// 通过用户ID更新用户头像
	public Result updateAvatarByUserId( @RequestParam("newAvatar") MultipartFile newAvatar, HttpServletRequest request) throws IOException {
		Users user = tokenUtil.resolveToken(request);
		if (user == null) {
			return Result.error("用户不存在");
		}
		// 上传新的头像到阿里云 OSS
		String avatarUrl = aliOSSUtils.deleteAndSaveNewFile(user.getAvatarUrl(),newAvatar);
		// 更新用户头像信息
		user.setAvatarUrl(avatarUrl);
		usersService.updateById(user);
		return Result.success(avatarUrl);
	}

	/**
	 * 用户登录接口
	 *
	 * @param loginRequest 登录请求对象，包含用户名和密码
	 * @return 登录结果
	 */
	@PostMapping("/login")
	@ApiOperation("用户登录接口")
	public Result<Users> login(@RequestBody LoginRequest loginRequest) {
		// 验证密码是否匹配
		String encrypt = SHA256Encryptor.encrypt(loginRequest.getPassword());
		loginRequest.setPassword(SHA256Encryptor.encrypt(loginRequest.getPassword()));
		// 从数据库或其他存储中获取用户信息
		return usersService.login(loginRequest);
	}


	/**
	 * 根据用户ID查询用户信息
	 *
	 * @param userId 用户ID
	 * @return 用户信息
	 */
	@GetMapping("/{userId}")
	@ApiOperation("根据用户ID查询用户信息")
	public Result<Users> getUserById(@PathVariable String userId) {
		Users user = usersService.getById(userId);
		// 不返回用户密码信息
		user.setPassword(null);
		return Result.success(user);
	}

	@GetMapping("/")
	@ApiOperation("根据请求解析token获取用户信息")
	public Result<Users> getUserByToken(HttpServletRequest request) {
		Users user = tokenUtil.resolveToken(request);
		// 不返回用户密码信息
		user.setPassword(null);
		return Result.success(user);
	}

	/**
	 * 新增用户
	 *
	 * @param user 用户信息
	 * @return 是否新增成功
	 */
	@PostMapping("/add")
	@ApiOperation("新增用户")
	public Result saveUser(@RequestBody Users user) {
		Users users = usersService.getById(user.getUserId());
		if(users!=null){
			return Result.error("用户账号已存在，不可重复添加");
		}
		user.setAvatarUrl("http://kzjsxy.oss-cn-wulanchabu.aliyuncs.com/默认头像.jpg");
		user.setPassword(user.getUserId());
		// 对用户密码进行加密
		user.setPassword(SHA256Encryptor.encrypt(user.getPassword()));
		return Result.judgment(usersService.save(user));
	}

	/**
	 * 重置密码
	 * @param userId 用户ID
	 * @return 是否重置成功
	 */
	@PutMapping("/update/{userId}")
	@ApiOperation("更新用户信息")
	public Result resetPassword(@PathVariable String userId){
		Users user = usersService.getById(userId);
		if(user==null){
			return Result.error("用户账号不存在!!");
		}
		user.setPassword(user.getUserId());
		// 对用户密码进行加密
		user.setPassword(SHA256Encryptor.encrypt(user.getPassword()));
		return Result.judgment(usersService.updateById(user));
	}

	/**
	 * 更新用户信息
	 *
	 * @param user 用户信息
	 * @return 是否更新成功
	 */
	@PutMapping("/update")
	@ApiOperation("更新用户信息")
	public Result updateUser(@RequestBody Users user) {
		// 对用户密码进行加密
		if(user.getPassword()!=null&&!user.getPassword().isEmpty()){
			user.setPassword(SHA256Encryptor.encrypt(user.getPassword()));
		}
		return Result.judgment(usersService.updateById(user));

	}

	/**
	 * 根据用户ID删除用户
	 *
	 * @param userId 用户ID
	 * @return 是否删除成功
	 */
	@DeleteMapping("/{userId}")
	@ApiOperation("根据用户ID删除用户")
	public Result deleteUser(@PathVariable String userId) {
		return Result.judgment(usersService.removeById(userId));
	}

	/**
	 * 查询所有用户列表
	 *
	 * @return 用户列表
	 */
	@PostMapping("/list")
	@ApiOperation("查询所有用户列表")
	public Result<List<Users>> listUsers(@RequestBody Users users) {
		List<Users> userList = usersService.selectUserByCondition(users);
		// 不返回用户密码信息
		return Result.success(userList);
	}


	/**
	 * 锁定/解锁
	 */
	@PutMapping("/lock/{userId}")
	@ApiOperation("锁定/解锁")
	public Result lock(@PathVariable String userId) {
		Users users = usersService.getById(userId);
		if(users==null){
			return Result.error("用户不存在");
		}
		users.setIsLocked(!users.getIsLocked());
		return Result.judgment(usersService.updateById(users));
	}


	/**
	 * 分页查询所有用户列表
	 *
	 * @return 用户列表
	 */
	@PostMapping("/page")
	@ApiOperation("分页查询所有用户列表")
	public Result<PageInfo<Users>> getUserByPage(Page page, @RequestBody Users users) {
		return usersService.selectUserByPage(page,users);
	}


}
